/*
 * Copyright (c) 2010, Nikolaus Moll
 * All rights reserved.
 */
package net.miblounge.gradecalculator.guicommon.dialogs;

import java.util.List;
import java.util.Vector;

import net.miblounge.gradecalculator.guicommon.interfaces.IValidationListener;
import net.miblounge.miglayout.qt.MigLayout;

import com.trolltech.qt.core.QSize;
import com.trolltech.qt.core.Qt.ScrollBarPolicy;
import com.trolltech.qt.gui.QDialog;
import com.trolltech.qt.gui.QFrame.Shape;
import com.trolltech.qt.gui.QPushButton;
import com.trolltech.qt.gui.QScrollArea;
import com.trolltech.qt.gui.QWidget;

public abstract class AbstractDialog extends QDialog implements IValidationListener {
	private QPushButton btnOk;
	private QScrollArea scrollArea;
	
	public AbstractDialog(final QWidget parent)
	{
		super(parent);

		setWindowTitle(tr("Result"));
	
		final MigLayout layout = new MigLayout("", "[left, grow]", "[top, grow]0[shrink 0, grow 0]");
		setLayout(layout);
		
		scrollArea = createScrollArea();
		layout.addWidget(scrollArea, "grow, wrap");
		layout.addWidget(createButtonBar(), "align right");
		
	}
	
	protected QWidget createButtonBar()
	{
		final QWidget result = new QWidget(this);
		final MigLayout layout = new MigLayout("", "[][]", "[]");
		result.setLayout(layout);
		
		btnOk = new QPushButton(tr("&Ok"), result);
		btnOk.clicked.connect(this, "clickOk()");
		btnOk.setDefault(true);
		
		final QPushButton btnCancel = new QPushButton(tr("Cancel"), result);
		btnCancel.clicked.connect(this, "clickCancel()");
		
		layout.addWidget(btnOk, "w 100::, sg bg");
		layout.addWidget(btnCancel, "w 100::, sg bg");
		
		return result;
	}
	
	protected QScrollArea createScrollArea()
	{
		final QScrollArea result = new QScrollArea(this) { 
			public QSize sizeHint()
			{
				if (this.widget() != null) {
					return this.widget().sizeHint(); 
				} else {
					return super.sizeHint();
				}
			}
		};
		result.setHorizontalScrollBarPolicy(ScrollBarPolicy.ScrollBarAsNeeded);
		result.setVerticalScrollBarPolicy(ScrollBarPolicy.ScrollBarAsNeeded);
		result.setWidgetResizable(true);
		result.setFrameShape(Shape.NoFrame);

		return result;
	}
	
	public void setClientArea(final QWidget widget)
	{
		widget.setParent(scrollArea);
		scrollArea.setWidget(widget);
	}
	
	protected List<QWidget> createAdditonalWidgets(final QWidget parent)
	{
		return new Vector<QWidget>();
	}
		
	protected boolean validate()
	{
		return true;
	}

	public void revalidate()
	{
		btnOk.setEnabled(validate());
	}
	
	protected final void clickOk()
	{
		if (validate()) {
			//apply();
			accept();
		}
	}

	protected void clickCancel()
	{
		reject();
	}
	
	public void apply()
	{
	}
	
}
